yidaconnector 2026.6.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +383 -0
  3. package/bin/yida.js +670 -0
  4. package/lib/app/form-navigation.js +58 -0
  5. package/lib/app/get-schema.js +538 -0
  6. package/lib/auth/auth.js +294 -0
  7. package/lib/auth/cdp-browser-login.js +390 -0
  8. package/lib/auth/codex-login.js +71 -0
  9. package/lib/auth/login.js +475 -0
  10. package/lib/auth/org.js +363 -0
  11. package/lib/auth/qr-login.js +1563 -0
  12. package/lib/core/chalk.js +384 -0
  13. package/lib/core/check-update.js +82 -0
  14. package/lib/core/cli-error.js +39 -0
  15. package/lib/core/command-manifest.js +106 -0
  16. package/lib/core/env-cmd.js +545 -0
  17. package/lib/core/env-manager.js +601 -0
  18. package/lib/core/env.js +287 -0
  19. package/lib/core/i18n.js +177 -0
  20. package/lib/core/locales/ar.js +805 -0
  21. package/lib/core/locales/de.js +805 -0
  22. package/lib/core/locales/en.js +1623 -0
  23. package/lib/core/locales/es.js +805 -0
  24. package/lib/core/locales/fr.js +805 -0
  25. package/lib/core/locales/hi.js +805 -0
  26. package/lib/core/locales/ja.js +1197 -0
  27. package/lib/core/locales/ko.js +807 -0
  28. package/lib/core/locales/pt.js +805 -0
  29. package/lib/core/locales/vi.js +805 -0
  30. package/lib/core/locales/zh-HK.js +1233 -0
  31. package/lib/core/locales/zh.js +1584 -0
  32. package/lib/core/query-data.js +781 -0
  33. package/lib/core/redact.js +100 -0
  34. package/lib/core/utils.js +799 -0
  35. package/lib/core/yida-client.js +117 -0
  36. package/package.json +94 -0
  37. package/project/config.json +4 -0
  38. package/project/pages/src/demo-birthday-game.oyd.jsx +832 -0
  39. package/project/pages/src/demo-chip-insight.oyd.jsx +983 -0
  40. package/project/pages/src/demo-compat-smoke.oyd.jsx +58 -0
  41. package/project/pages/src/demo-crm-batch-entry.oyd.jsx +805 -0
  42. package/project/pages/src/demo-crm-dashboard.oyd.jsx +677 -0
  43. package/project/pages/src/demo-future-vision-2026.oyd.jsx +1102 -0
  44. package/project/pages/src/demo-ppt.oyd.jsx +1192 -0
  45. package/project/pages/src/demo-salary-calculator.oyd.jsx +904 -0
  46. package/project/pages/src/yidaconnector-knowledge-doc.oyd.jsx +1714 -0
  47. package/project/prd/demo-birthday-game.md +39 -0
  48. package/project/prd/demo-crm.md +463 -0
  49. package/project/prd/demo-dingtalk-ai-solution-center.md +425 -0
  50. package/project/prd/demo-future-vision-2026.md +78 -0
  51. package/project/prd/demo-salary-calculator.md +101 -0
  52. package/scripts/build-skills-package.js +406 -0
  53. package/scripts/check-syntax.js +59 -0
  54. package/scripts/demo-dws.sh +106 -0
  55. package/scripts/e2e-real/cleanup.js +67 -0
  56. package/scripts/e2e-real/fixtures/form-fields.json +18 -0
  57. package/scripts/e2e-real/full-runner.js +1566 -0
  58. package/scripts/e2e-real/runner.js +293 -0
  59. package/scripts/e2e-real/skill-coverage.js +115 -0
  60. package/scripts/generate-command-docs.js +109 -0
  61. package/scripts/nightly-smoke.js +134 -0
  62. package/scripts/postinstall.js +545 -0
  63. package/scripts/solution-center-runner.js +368 -0
  64. package/scripts/validate-ci.sh +50 -0
  65. package/scripts/validate-command-manifest.js +119 -0
  66. package/scripts/validate-package-size.js +78 -0
  67. package/scripts/validate-skills.js +247 -0
  68. package/scripts/validate-structure.js +66 -0
  69. package/yida-skills/SKILL.md +163 -0
  70. package/yida-skills/references/yida-api.md +1309 -0
  71. package/yida-skills/skills/large-file-write/SKILL.md +91 -0
  72. package/yida-skills/skills/large-file-write/references/write-patterns.md +149 -0
  73. package/yida-skills/skills/large-file-write/scripts/write.js +157 -0
  74. package/yida-skills/skills/yida-data-management/SKILL.md +252 -0
  75. package/yida-skills/skills/yida-data-management/references/api-matrix.md +49 -0
  76. package/yida-skills/skills/yida-data-management/references/data-format-guide.md +159 -0
  77. package/yida-skills/skills/yida-data-management/references/verified-endpoints.md +62 -0
  78. package/yida-skills/skills/yida-login/SKILL.md +159 -0
  79. package/yida-skills/skills/yida-logout/SKILL.md +67 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Alibaba Group Holding Limited
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,383 @@
1
+ <div align="center">
2
+
3
+ ![YidaConnector](https://img.alicdn.com/imgextra/i3/O1CN01SKWbWu1aPzGXh293W_!!6000000003323-2-tps-1672-941.png)
4
+
5
+ # YidaConnector
6
+
7
+ **宜搭数据查询与登录态管理 CLI。**
8
+
9
+ YidaConnector 让 AI 编程助手(悟空 / Claude Code / Codex / Cursor / OpenCode 等)和宜搭低代码平台对接,专注于表单、流程、任务、子表单数据的查询与变更,以及登录态、多组织、多环境的管理。
10
+
11
+ [Quick Start](#quick-start) · [Data Command](#data-command) · [CLI Reference](#cli-reference) · [Contributing](./CONTRIBUTING.md) · [Changelog](./CHANGELOG.md)
12
+
13
+ [![npm version](https://img.shields.io/npm/v/yidaconnector?color=brightgreen&label=npm)](https://www.npmjs.com/package/yidaconnector)
14
+ [![npm downloads](https://img.shields.io/npm/dm/yidaconnector?color=blue)](https://www.npmjs.com/package/yidaconnector)
15
+ [![CI](https://github.com/bunnyrui/yidaconnector/actions/workflows/ci.yml/badge.svg)](https://github.com/bunnyrui/yidaconnector/actions/workflows/ci.yml)
16
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
17
+ [![Node.js >=18](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
18
+
19
+ **Documentation:** [GitHub README](https://github.com/bunnyrui/yidaconnector#readme)
20
+
21
+ </div>
22
+
23
+ ---
24
+
25
+ ## Quick Start
26
+
27
+ ### 1. Install
28
+
29
+ ```bash
30
+ npm install -g yidaconnector
31
+ ```
32
+
33
+ YidaConnector requires Node.js 18 or later. The package exposes both `yidaconnector` and `yida` commands.
34
+
35
+ ### 2. Check Your Environment
36
+
37
+ Run this from the AI coding workspace where you want YidaConnector to operate:
38
+
39
+ ```bash
40
+ yidaconnector env
41
+ yidaconnector env --json
42
+ yidaconnector commands --json
43
+ ```
44
+
45
+ YidaConnector detects the active agent environment, workspace path, login state, and organization context. Use `--json` when an agent needs a stable machine-readable snapshot.
46
+ `yidaconnector commands --json` emits the command manifest used by the CLI help, so agents can inspect available routes without scraping terminal output.
47
+
48
+ ### 3. Log In
49
+
50
+ ```bash
51
+ yidaconnector login
52
+ ```
53
+
54
+ In Codex, QoderWork, Qoder, Wukong, Claude Code, OpenCode, Cursor, and other detected AI tools, YidaConnector first tries local Chrome/Edge/Chromium CDP when no valid cached login exists. If local CDP is unavailable, it falls back to an AI-dialog QR handoff. The explicit `yidaconnector login --browser` command still prefers CDP first and uses Playwright as an optional browser fallback.
55
+
56
+ When the user names a target Yida entry URL, pass it to the login command so YidaConnector can select the matching environment and cookie file. For example, Alibaba intranet Yida:
57
+
58
+ ```bash
59
+ yidaconnector login https://yida-group.alibaba-inc.com/
60
+ yidaconnector login --alibaba
61
+ ```
62
+
63
+ For terminal QR login, use:
64
+
65
+ ```bash
66
+ yidaconnector login --qr
67
+ ```
68
+
69
+ ### 4. Query Data
70
+
71
+ ```bash
72
+ # 查询表单数据(分页)
73
+ yidaconnector data query form APP_XXX FORM_XXX --page 1 --size 20
74
+
75
+ # 查询全部表单数据(自动翻页)
76
+ yidaconnector data query form APP_XXX FORM_XXX --all
77
+
78
+ # 按条件查询
79
+ yidaconnector data query form APP_XXX FORM_XXX --search-json '[{"key":"radioField_xxx","op":"Equal","value":"合格"}]'
80
+
81
+ # 获取单条表单实例
82
+ yidaconnector data get form APP_XXX --inst-id FORM_INST_XXX
83
+
84
+ # 查询流程实例
85
+ yidaconnector data query process APP_XXX FORM_XXX --page 1 --size 10
86
+
87
+ # 查询待办任务
88
+ yidaconnector data query tasks APP_XXX --type todo
89
+ ```
90
+
91
+ ## What YidaConnector Does
92
+
93
+ | Area | What you can do |
94
+ |------|-----------------|
95
+ | **Form data** | Query / get / create / update form instances; query subform rows |
96
+ | **Process data** | Query / get / create / update process instances; query operation records |
97
+ | **Task operations** | Query todo / done / submitted / cc tasks; execute (approve/reject) tasks |
98
+ | **Login state** | Login (CDP / QR / browser handoff), logout, refresh, status check |
99
+ | **Organization** | List and switch organizations (multi-org accounts) |
100
+ | **Environment** | Detect AI tool environment; manage public / private deployment profiles |
101
+
102
+ All data operations respect the current Yida login user's data permissions — YidaConnector never bypasses platform security controls.
103
+
104
+ ## Data Command
105
+
106
+ `yidaconnector data` is the unified entry point for all data operations. The syntax is `data <action> <resource> [args] [options]`.
107
+
108
+ ### Form Operations
109
+
110
+ ```bash
111
+ # 查询表单数据(分页 / 全量 / 按条件)
112
+ yidaconnector data query form <appType> <formUuid> [--page N] [--size N] [--all]
113
+ yidaconnector data query form <appType> <formUuid> --search-file .cache/yidaconnector/search.json
114
+
115
+ # 获取单条表单实例
116
+ yidaconnector data get form <appType> --inst-id <formInstId> [--form-uuid <formUuid>]
117
+
118
+ # 新建表单实例
119
+ yidaconnector data create form <appType> <formUuid> --data-file .cache/yidaconnector/data.json
120
+
121
+ # 更新表单实例
122
+ yidaconnector data update form <appType> --inst-id <formInstId> --data-file .cache/yidaconnector/data.json
123
+
124
+ # 查询子表单明细
125
+ yidaconnector data query subform <appType> <formUuid> --inst-id <formInstId> --table-field-id <fieldId>
126
+ ```
127
+
128
+ ### Process Operations
129
+
130
+ ```bash
131
+ # 查询流程实例
132
+ yidaconnector data query process <appType> <formUuid> [--page N] [--size N]
133
+
134
+ # 获取单个流程实例
135
+ yidaconnector data get process <appType> --process-inst-id <processInstanceId>
136
+
137
+ # 发起流程
138
+ yidaconnector data create process <appType> <formUuid> --process-code <processCode> --data-file .cache/yidaconnector/data.json
139
+
140
+ # 更新流程表单数据
141
+ yidaconnector data update process <appType> --process-inst-id <processInstanceId> --data-file .cache/yidaconnector/data.json
142
+
143
+ # 查询操作记录
144
+ yidaconnector data query operation-records <appType> --process-inst-id <processInstanceId>
145
+ ```
146
+
147
+ ### Task Operations
148
+
149
+ ```bash
150
+ # 查询任务列表(todo=待办 / done=已处理 / submitted=我发起的 / cc=抄送)
151
+ yidaconnector data query tasks <appType> --type <todo|done|submitted|cc> [--keyword <text>] [--page N] [--size N]
152
+
153
+ # 执行审批任务(同意/驳回)
154
+ yidaconnector data execute task <appType> \
155
+ --task-id <taskId> \
156
+ --process-inst-id <processInstanceId> \
157
+ --out-result <AGREE|DISAGREE> \
158
+ --remark "审批意见"
159
+ ```
160
+
161
+ ### Data Command Notes
162
+
163
+ - **Component aliases**: Add `--resolve-aliases` to use field aliases (like `phone`) instead of raw field IDs (like `textField_xxx`) in `--data-json` / `--search-json`.
164
+ - **Date fields**: Yida date fields require 13-digit millisecond timestamps (e.g. `1719705600000`), not `YYYY-MM-DD` strings.
165
+ - **Page size**: Max 100 per page; `--all` auto-paginates; `--max-pages` caps the total pages fetched.
166
+ - **Temporary files**: Write query results, search JSON, and import data to `.cache/yidaconnector/` to keep the repository root clean.
167
+
168
+ ## Login & Environment
169
+
170
+ ### Login Modes
171
+
172
+ | Command | Behavior |
173
+ |---------|----------|
174
+ | `yidaconnector login` | Cache first; falls back to CDP, then QR handoff |
175
+ | `yidaconnector login --browser` | Force local browser (CDP, Playwright fallback) |
176
+ | `yidaconnector login --qr` | Force terminal QR code |
177
+ | `yidaconnector login --agent-qr` | Force AI-dialog QR handoff |
178
+ | `yidaconnector login --codex` / `--qoder` / `--wukong` | Tool-specific browser handoff |
179
+ | `yidaconnector login --check-only` | Read-only login state check, no login triggered |
180
+ | `yidaconnector login <url>` | Login to a specific Yida entry URL |
181
+
182
+ ### Environment Management
183
+
184
+ ```bash
185
+ # 查看当前环境(AI 工具、登录态、base URL)
186
+ yidaconnector env
187
+ yidaconnector env --json
188
+
189
+ # 多环境管理(公有云 / 国际版 / 阿里内部 / 私有化)
190
+ yidaconnector env list
191
+ yidaconnector env switch <name>
192
+ yidaconnector env add <name>
193
+ ```
194
+
195
+ ### Organization Switching
196
+
197
+ ```bash
198
+ yidaconnector org list
199
+ yidaconnector org switch --corp-id <corpId>
200
+ ```
201
+
202
+ ## How It Works
203
+
204
+ ```mermaid
205
+ flowchart LR
206
+ A["AI coding agent"] --> B["YidaConnector CLI"]
207
+ B --> C["Environment detection"]
208
+ B --> D["Login & org context"]
209
+ B --> E["Yida data API"]
210
+ E --> F["Form / process / task data"]
211
+ ```
212
+
213
+ YidaConnector keeps platform-specific behavior inside the CLI, while agents interact with predictable commands and project files.
214
+
215
+ ## Project Layout
216
+
217
+ ```text
218
+ yidaconnector/
219
+ ├── bin/yida.js # CLI entry and command routing
220
+ ├── lib/
221
+ │ ├── app/ # Form schema helpers (get-schema, form-navigation)
222
+ │ ├── auth/ # Login (CDP / QR / Codex), auth state, org switch
223
+ │ └── core/ # Environment detection, i18n, data commands, HTTP client
224
+ ├── project/ # Default workspace template
225
+ ├── yida-skills/ # Source skill docs and Yida API references
226
+ └── scripts/ # CI, packaging, and installation helpers
227
+ ```
228
+
229
+ ## CLI Reference
230
+
231
+ Run `yidaconnector --help` or `yidaconnector <command> --help` for detailed usage.
232
+
233
+ <!-- YIDACONNECTOR_COMMANDS_START -->
234
+ <!-- This section is generated by `npm run docs:commands`. Do not edit command rows by hand. -->
235
+
236
+ ### Auth & Environment
237
+
238
+ | Command | Description |
239
+ |---------|-------------|
240
+ | `yidaconnector login [target-url] [--qr\|--agent-qr\|--codex\|--browser] [--env <name>\|--intl\|--overseas\|--global\|--yidaapps\|--alibaba] [--corp-id <corpId>]` | Login (cache first, --browser or --agent-qr when needed) |
241
+ | `yidaconnector logout` | Logout / switch account |
242
+ | `yidaconnector auth <status\|login\|refresh\|logout>` | Login state management |
243
+ | `yidaconnector org <list\|switch>` | Organization management (list / switch) |
244
+ | `yidaconnector env [--json]` | Detect AI tool environment & login state |
245
+ | `yidaconnector env <setup\|list\|show\|switch\|add\|remove>` | Manage public/private Yida environment profiles |
246
+
247
+ ### Data & Permissions
248
+
249
+ | Command | Description |
250
+ |---------|-------------|
251
+ | `yidaconnector data <action> <resource> [args]` | Unified data management (form/process/task/subform) |
252
+
253
+ ### Utility
254
+
255
+ | Command | Description |
256
+ |---------|-------------|
257
+ | `yidaconnector commands [--json]` | Output machine-readable command manifest |
258
+
259
+ <!-- YIDACONNECTOR_COMMANDS_END -->
260
+
261
+ ### CLI Notes
262
+
263
+ #### Environment and Localization
264
+
265
+ Environment selectors such as `--env intl`, `--intl`, `--overseas`, `--global`, and `--yidaapps` can be used on login to choose the target Yida environment for that run. The `intl` preset uses `https://www.yidaapps.com` as the built-in Global YiDA entrypoint and DingTalk International OAuth at `https://login.dingtalk.io`.
266
+
267
+ #### Component Aliases
268
+
269
+ Yida form fields can have aliases (e.g. `phone` instead of `textField_xxx`). Use `yidaconnector data ... --resolve-aliases` to accept aliases in `--data-json` / `--search-json` inputs; YidaConnector translates them to field IDs before sending requests.
270
+
271
+ ## Agent Skills
272
+
273
+ The `yida-skills/` directory is the source skill library. Release assets for Wukong are generated by `npm run build:skills`: the expanded package is written to `dist/skills/yidaconnector/`, and the upload-ready zip is written to `yidaconnector-skills.zip`.
274
+
275
+ | Skill | Purpose |
276
+ |------|---------|
277
+ | `yida-data-management` | Form / subform / process / task data query and mutation |
278
+ | `yida-login` | Login state management (usually auto-triggered) |
279
+ | `yida-logout` | Logout / switch account |
280
+ | `large-file-write` | Reliable large file write helper |
281
+
282
+ For Wukong manual import, upload the generated `yidaconnector-skills.zip`. For Codex, `npm install -g yidaconnector` additionally creates a local plugin marketplace under `~/.yidaconnector/codex-plugin`.
283
+
284
+ ## Wukong Installation
285
+
286
+ Wukong uses manual skill package installation instead of npm:
287
+
288
+ 1. Download the latest `.zip` skill package from [GitHub Releases](https://github.com/bunnyrui/yidaconnector/releases).
289
+ 2. Open Wukong.
290
+ 3. Go to **Skill Center** > **Upload Skill** and select the downloaded package.
291
+
292
+ For Wukong terminal work, make sure its bundled Node.js path is active before running `node`, `npm`, or `npx` commands:
293
+
294
+ ```bash
295
+ export PATH="$HOME/.real/.bin/node/bin:$PATH"
296
+ ```
297
+
298
+ ## Supported AI Coding Tools
299
+
300
+ | Tool | Support |
301
+ |------|---------|
302
+ | [Codex](https://openai.com/codex/) | Full support |
303
+ | [Claude Code](https://claude.ai/code) | Full support |
304
+ | [Aone Copilot](https://copilot.code.alibaba-inc.com) | Full support |
305
+ | [OpenCode](https://opencode.ai) | Full support |
306
+ | [Cursor](https://cursor.com/) | Full support |
307
+ | [Visual Studio Code](https://code.visualstudio.com/) | Full support |
308
+ | [QoderWork](https://qoder.com) | Full support |
309
+ | [Qoder](https://qoder.com) | Full support |
310
+ | [Wukong](https://dingtalk.com/wukong) | Full support |
311
+
312
+ ## Development
313
+
314
+ ```bash
315
+ git clone https://github.com/bunnyrui/yidaconnector.git
316
+ cd yidaconnector
317
+ npm install
318
+ npm run check:ci
319
+ ```
320
+
321
+ Useful checks:
322
+
323
+ | Command | Purpose |
324
+ |---------|---------|
325
+ | `npm test` | Run Jest tests |
326
+ | `npm run lint` | Run ESLint |
327
+ | `npm run check:quick` | Run structure, manifest, syntax, and lint checks |
328
+ | `npm run check:commands` | Validate router, command manifest, and README alignment |
329
+ | `npm run docs:commands` | Regenerate the README command index from the manifest |
330
+ | `npm run check:docs` | Verify generated README command docs are current |
331
+ | `npm run check:syntax` | Validate JavaScript syntax |
332
+ | `npm run check:skills` | Validate agent skills structure and links |
333
+
334
+ When adding new CLI commands, register the route in `bin/yida.js`, add it to `lib/core/command-manifest.js`, regenerate the README command index with `npm run docs:commands`, and keep agent skills in `yida-skills/` aligned. `npm run check:commands` fails if the router, manifest, or README drift apart.
335
+
336
+ ## Security and Configuration
337
+
338
+ - Login cookies are cached locally and should never be hard-coded into source files.
339
+ - Private deployment environments are managed through `lib/core/env-manager.js`.
340
+ - Yida API requests use the active environment base URL and authenticated cookies.
341
+ - For multi-organization accounts, prefer explicit `--corp-id` values in non-interactive automation.
342
+
343
+ ## Community
344
+
345
+ Scan the QR code to join the YidaConnector DingTalk user group for updates and support.
346
+
347
+ ![Join YidaConnector Community](https://img.alicdn.com/imgextra/i4/O1CN01RAlxmO1qF1cxRguyj_!!6000000005465-2-tps-350-356.png)
348
+
349
+ ## Contributors
350
+
351
+ Thanks to everyone who has contributed to YidaConnector. Read the [Contributing Guide](./CONTRIBUTING.md) to get involved.
352
+
353
+ Latest contributors: [DDlixin1](https://github.com/DDlixin1), [fcloud](https://github.com/fcloud).
354
+
355
+ <!-- yidaconnector-contributors:start -->
356
+
357
+ <p>
358
+ <a href="https://github.com/yize"><img src="https://github.com/yize.png?size=48" width="48" height="48" alt="九神" title="九神" /></a>
359
+ <a href="https://github.com/alex-mm"><img src="https://github.com/alex-mm.png?size=48" width="48" height="48" alt="天晟" title="天晟" /></a>
360
+ <a href="https://github.com/DDlixin1"><img src="https://github.com/DDlixin1.png?size=48" width="48" height="48" alt="DDlixin1" title="DDlixin1" /></a>
361
+ <a href="https://github.com/fcloud"><img src="https://github.com/fcloud.png?size=48" width="48" height="48" alt="Aiden Wu (fcloud)" title="Aiden Wu (fcloud)" /></a>
362
+ <a href="https://github.com/nicky1108"><img src="https://github.com/nicky1108.png?size=48" width="48" height="48" alt="nicky1108" title="nicky1108" /></a>
363
+ <a href="https://github.com/angelinheys"><img src="https://github.com/angelinheys.png?size=48" width="48" height="48" alt="angelinheys" title="angelinheys" /></a>
364
+ <a href="https://github.com/yipengmu"><img src="https://github.com/yipengmu.png?size=48" width="48" height="48" alt="yipengmu" title="yipengmu" /></a>
365
+ <a href="https://github.com/Waawww"><img src="https://github.com/Waawww.png?size=48" width="48" height="48" alt="Waawww" title="Waawww" /></a>
366
+ <a href="https://github.com/kangjiano"><img src="https://github.com/kangjiano.png?size=48" width="48" height="48" alt="kangjiano" title="kangjiano" /></a>
367
+ <a href="https://github.com/ElZe98"><img src="https://github.com/ElZe98.png?size=48" width="48" height="48" alt="ElZe98" title="ElZe98" /></a>
368
+ <a href="https://github.com/OAHyuhao"><img src="https://github.com/OAHyuhao.png?size=48" width="48" height="48" alt="OAHyuhao" title="OAHyuhao" /></a>
369
+ <a href="https://github.com/xiaofu704"><img src="https://github.com/xiaofu704.png?size=48" width="48" height="48" alt="xiaofu704" title="xiaofu704" /></a>
370
+ <a href="https://github.com/guchenglin111"><img src="https://github.com/guchenglin111.png?size=48" width="48" height="48" alt="guchenglin111" title="guchenglin111" /></a>
371
+ <a href="https://github.com/liug0911"><img src="https://github.com/liug0911.png?size=48" width="48" height="48" alt="LIUG" title="LIUG" /></a>
372
+ <a href="https://github.com/sunliz-xiuli"><img src="https://github.com/sunliz-xiuli.png?size=48" width="48" height="48" alt="sunliz-xiuli" title="sunliz-xiuli" /></a>
373
+ <a href="https://github.com/M12REDX"><img src="https://github.com/M12REDX.png?size=48" width="48" height="48" alt="M12REDX" title="M12REDX" /></a>
374
+ <a href="https://github.com/key-668"><img src="https://github.com/key-668.png?size=48" width="48" height="48" alt="再不喝汽水" title="再不喝汽水" /></a>
375
+ <a href="https://github.com/dongbeixiaohuo"><img src="https://github.com/dongbeixiaohuo.png?size=48" width="48" height="48" alt="dongbeixiaohuo" title="dongbeixiaohuo" /></a>
376
+ <a href="https://github.com/nandanadileep"><img src="https://github.com/nandanadileep.png?size=48" width="48" height="48" alt="nandanadileep" title="nandanadileep" /></a>
377
+ </p>
378
+
379
+ <!-- yidaconnector-contributors:end -->
380
+
381
+ ## License
382
+
383
+ [MIT](./LICENSE) © 2026 Alibaba Group Holding Limited